package org.paybiz.core.payplatform.tenPay.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;



/**
 * 类说明:
 * @author  lichunming
 * @version V1.0  创建时间：2009-12-20 上午11:46:54
 */
public class TenpayUtil {
    /**
     * 把对象转换成字符串
     * @param obj
     * @return String 转换成字符串,若对象为null,则返回空字符串.
     */
    public static String toString(Object obj) {
        if(obj == null)
            return "";
        
        return obj.toString();
    }
    
    /**
     * 把对象转换为int数值.
     * 
     * @param obj
     *            包含数字的对象.
     * @return int 转换后的数值,对不能转换的对象返回0。
     */
    public static int toInt(Object obj) {
        int a = 0;
        try {
            if (obj != null)
                a = Integer.parseInt(obj.toString());
        } catch (Exception e) {

        }
        return a;
    }
    
    /**
     * 获取当前时间 yyyyMMddHHmmss
     * @return String
     */ 
    public static String getCurrTime() {
        Date now = new Date();
        SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        String s = outFormat.format(now);
        return s;
    }
    
    /**
     * 获取当前日期 yyyyMMdd
     * @param date
     * @return String
     */
    public static String formatDate(Date date) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
        String strDate = formatter.format(date);
        return strDate;
    }
    
    /**
     * 取出一个指定长度大小的随机正整数.
     * 
     * @param length
     *            int 设定所取出随机数的长度。length小于11
     * @return int 返回生成的随机数。
     */
    public static int buildRandom(int length) {
        int num = 1;
        double random = Math.random();
        if (random < 0.1) {
            random = random + 0.1;
        }
        for (int i = 0; i < length; i++) {
            num = num * 10;
        }
        return (int) ((random * num));
    }
    
    /**
     * 获取编码字符集
     * @param request
     * @param response
     * @return String
     */
    public static String getCharacterEncoding(HttpServletRequest request,
            HttpServletResponse response) {
        
        if(null == request || null == response) {
            return "gbk";
        }
        
        String enc = request.getCharacterEncoding();
        if(null == enc || "".equals(enc)) {
            enc = response.getCharacterEncoding();
        }
        
        if(null == enc || "".equals(enc)) {
            enc = "gbk";
        }
        
        return enc;
    }
    
    public static String getCharacterEncoding() {
        return "GBK";
    }
    
    /**
     * 获取unix时间，从1970-01-01 00:00:00开始的秒数
     * @param date
     * @return long
     */
    public static long getUnixTime(Date date) {
        if( null == date ) {
            return 0;
        }
        
        return date.getTime()/1000;
    }
    
    /**
     * 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
     * @param sortedMap 排序map
     * @param tenKey 财付通key
     * @param charset 编码
     * @return
     */
    public static String createSign(SortedMap<String, String> sortedMap,String tenKey,String charset) {
        StringBuffer sb = new StringBuffer();
        Set es = sortedMap.entrySet();
        Iterator it = es.iterator();
        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String k = (String)entry.getKey();
            String v = (String)entry.getValue();
            if(null != v && !"".equals(v) 
                    && !"sign".equals(k) && !"key".equals(k)) {
                sb.append(k + "=" + v + "&");
            }
        }
        sb.append("key=" + tenKey);
        String sign = MD5Util.MD5Encode(sb.toString(), charset).toLowerCase();
        System.out.println(MD5Util.MD5Encode(sb.toString(), "UTF-8").toLowerCase());
        return sign;
        
    }
    /**
     *B = base64Str
     *对B进行MD5生成C（小写）；
     *C后面加上商户的key再进行一次MD5，生成D（小写）；
     *计算公式如下：
     *content的值为:base64_encode(XML字符串);
     *abstract的值为:md5(md5(content)+key)，加号表示连接，不要参与md5.
     * @param base64Str
     * @param tenKey
     * @param charset
     * @return 
     */
    public static String createTransferSign(String base64Str,String tenKey,String charset) {
        String md5 = MD5Util.MD5Encode(base64Str, charset).toLowerCase();
        System.out.println("base64 md5: " + md5);
        System.out.println("key: " + tenKey);
        System.out.println("2nd md5: " + MD5Util.MD5Encode(md5+tenKey, charset));
        String sign = MD5Util.MD5Encode(md5+tenKey, charset).toLowerCase();
        return sign;
    }
    /**
     * base64加密
     * @param str
     * @return
     * @throws UnsupportedEncodingException 
     */
    public static String encodeString(String str,String chartset) throws UnsupportedEncodingException  {
        sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder();
        return encoder.encodeBuffer(str.getBytes(chartset)).trim();
    }
    
    /**
     * base64解密
     * @param str
     * @return
     */
     public static String decodeString(String str) {
        sun.misc.BASE64Decoder dec = new sun.misc.BASE64Decoder();
        try {
            return new String(dec.decodeBuffer(str));
        } catch (IOException io) {
            throw new RuntimeException(io.getMessage(), io.getCause());
        }
     }
     
     
}
